package com.bnq.face

import android.app.Activity
import android.graphics.*
import android.hardware.Camera
import android.os.Bundle
import android.util.Log
import android.view.Surface
import android.view.SurfaceHolder
import android.view.SurfaceView
import android.widget.ImageView
import androidx.appcompat.app.AppCompatActivity
import java.io.ByteArrayOutputStream
import java.io.IOException


class FaceActivity : AppCompatActivity() {

    private val WITDH = 640
    private val HEIGHT = 480

    private var mode = 0

    private lateinit var mSurfaceView:SurfaceView//? = null
    private var mCamera:Camera? = null
    private var isPreview = false
    private var mPreview:ImageView? = null
    private lateinit var buffer:ByteArray

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_face)
        mSurfaceView = findViewById<SurfaceView>(R.id.surface_view)
        mPreview = findViewById<ImageView>(R.id.preview)

        // 获得 SurfaceHolder 对象
        val mSurfaceHolder = mSurfaceView.holder

        // 设置 Surface 格式
        // 参数： PixelFormat中定义的 int 值 ,详细参见 PixelFormat.java
        mSurfaceHolder.setFormat(PixelFormat.RGB_565)

        // 如果需要，保持屏幕常亮
        // mSurfaceHolder.setKeepScreenOn(true);

        // 设置 Surface 的分辨率
        // mSurfaceHolder.setFixedSize(width,height);

        // 添加 Surface 的 callback 接口
        mSurfaceHolder.addCallback(mSurfaceCallback)
    }

    private val mSurfaceCallback = object : SurfaceHolder.Callback{
        override fun surfaceCreated(surfaceHolder: SurfaceHolder) {
            try {
                //打开硬件摄像头 这两句默认是后摄像头，如果指定摄像头用 ： Camera.open(CameraId) CameraId  0 （后置）  1 （前置）
                // Camera.open() 默认返回的后置摄像头信息 //导包得时候一定要注意是android.hardware.Camera
                // setCameraDisplayOrientation(MainActivity2.this,0,camera);

                //设置角度，此处 CameraId  0 （后置）  1 （前置）
                if (mode==0){//后置
                    mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);//打开硬件摄像头，这里导包得时候一定要注意是android.hardware.Camera
                    setCameraDisplayOrientation(this@FaceActivity,0,mCamera!!)
                }else {//前置
                    mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);//打开硬件摄像头，这里导包得时候一定要注意是android.hardware.Camera
                    setCameraDisplayOrientation(this@FaceActivity,1,mCamera!!)
                }

                //配置camera的属性
                val parameters = mCamera!!.parameters
                //设置预览数据格式为nv21
                parameters.previewFormat = ImageFormat.NV21
                //这是摄像头宽、高
                parameters.setPreviewSize(
                    WITDH,HEIGHT
                )

                /* Set Auto focus */
                val focusModes: List<String> = parameters.getSupportedFocusModes()
                if (focusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {
                    parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)
                } else if (focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
                    parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO)
                }
                // 设置摄像头 图像传感器的角度、方向
                mCamera!!.parameters = parameters

                //此处也可以设置摄像头参数
                /**
                WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);//得到窗口管理器
                Display display  = wm.getDefaultDisplay();//得到当前屏幕
                Camera.Parameters parameters = camera.getParameters();//得到摄像头的参数
                parameters.setPictureFormat(PixelFormat.RGB_888);//设置照片的格式
                parameters.setJpegQuality(85);//设置照片的质量
                parameters.setPictureSize(display.getHeight(), display.getWidth());//设置照片的大小，默认是和     屏幕一样大
                camera.setParameters(parameters);//设置需要预览的尺寸
                 **/
                mCamera!!.setPreviewDisplay(surfaceHolder)//通过SurfaceView显示取景画面
                buffer =
                    ByteArray(WITDH * HEIGHT * 3 / 2)
                //数据缓存区
                mCamera!!.addCallbackBuffer(buffer)
                mCamera!!.setPreviewCallbackWithBuffer{data,camera->
                    //val bitmap = BitmapFactory.decodeByteArray(data, 0, data.size)
                    //mPreview?.setImageBitmap(bitmap)
                    //Log.e("Face","----------------setPreviewCallbackWithBuffer:${data.size},${bitmap}")
                    mCamera!!.addCallbackBuffer(buffer)

                    val yuvimage =
                        YuvImage(data, ImageFormat.NV21, WITDH,HEIGHT, null)
                    val bos = ByteArrayOutputStream()
                    yuvimage.compressToJpeg(Rect(0, 0, WITDH,HEIGHT), 100, bos)
                    val jdata: ByteArray = bos.toByteArray()
                    val bitmap = BitmapFactory.decodeByteArray(jdata, 0, jdata.size).let {
                        Bitmap.createBitmap(it,0,0,it.width,it.height,Matrix().apply { postRotate(if(mode == 0)90f else -90f) },true)
                    }
                    mPreview?.setImageBitmap(bitmap)
                }
//                mCamera!!.setPreviewCallback{data,camera->
//
//
//                }
                mCamera!!.startPreview();//开始预览
                isPreview = true;//设置是否预览参数为真
            } catch (e : IOException) {
                Log.e("TAG", e.toString());
            }
        }

        override fun surfaceChanged(surfaceHolder: SurfaceHolder, p1: Int, p2: Int, p3: Int) {

        }

        override fun surfaceDestroyed(surfaceHolder: SurfaceHolder) {
            if(mCamera != null){
                if(isPreview){//正在预览
                    mCamera?.stopPreview();
                    mCamera?.release();
                }
            }
        }

    }


    /**
     * 设置 摄像头的角度
     *
     * @param activity 上下文
     * @param cameraId 摄像头ID（假如手机有N个摄像头，cameraId 的值 就是 0 ~ N-1）
     * @param camera   摄像头对象
     */
    fun setCameraDisplayOrientation(activity:Activity, cameraId:Int, camera:Camera) {

        val info = Camera.CameraInfo()
        //获取摄像头信息
        Camera.getCameraInfo(cameraId, info)
        val rotation = activity.getWindowManager().getDefaultDisplay().getRotation()

        //获取摄像头当前的角度
        var degrees = 0
        when (rotation) {
            Surface.ROTATION_0 -> {
                degrees = 0
            }
            Surface.ROTATION_90 -> {
                degrees = 90
            }
            Surface.ROTATION_180 -> {
                degrees = 180
            }
            Surface.ROTATION_270 -> {
                degrees = 270
            }
        }

        var result:Int
        if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
            //前置摄像头
            result = (info.orientation + degrees) % 360;
            result = (360 - result) % 360; // compensate the mirror
        } else {
            // back-facing  后置摄像头
            result = (info.orientation - degrees + 360) % 360;
        }
        camera.setDisplayOrientation(result)
    }

}